package com.atguigu.gmall.user.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.IpUtil;
import com.atguigu.gmall.model.user.LoginVo;
import com.atguigu.gmall.model.user.UserInfo;
import com.atguigu.gmall.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/api/user/passport")
public class PassportApiController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private UserService userService;
    //  传递的时候是user Json 对象！
    @PostMapping("login")
    public Result login(@RequestBody LoginVo loginVo, HttpServletRequest request){
        //  调用服务层方法.
        UserInfo info = userService.login(loginVo);
        if (info!=null){
            //  登录成功。
            String token = UUID.randomUUID().toString();
            //  创建一个map
            HashMap<String, Object> map = new HashMap<>();
            //  token 放入map 中
            map.put("token",token);
            //            Cookie cookie = new Cookie("token",token);
            //            cookie.setDomain("gmall.com");
            //            cookie.setPath("/");
            //            cookie.setMaxAge(30);
            //            response.addCookie(cookie);
            //  设置一个用户昵称
            map.put("nickName",info.getNickName());
            //  将用户信息存储到缓存： key = user:login:token
            String userLoginKey = RedisConst.USER_LOGIN_KEY_PREFIX+token; // key 唯一;

            //  添加一个 Ip 地址 放入缓存.
            JSONObject userJson = new JSONObject();
            userJson.put("ip", IpUtil.getIpAddress(request));
            userJson.put("userId", info.getId().toString());

            //  存储数据：userId; ip;
            this.redisTemplate.opsForValue().set(userLoginKey,userJson.toString(),RedisConst.USERKEY_TIMEOUT, TimeUnit.SECONDS);

            //  response.data.data.token 获取到token！
            return Result.ok(map);
        }else {
            return Result.fail().message("登录失败.");
        }
    }

    //  退出登录：
    @GetMapping("/logout")
    public Result logout(@RequestHeader String token,HttpServletRequest request){
        //  cookie 中的token ，userInfo 已经删除。
        //  删除redis！
        //  必须获取到token; cookie ---> token.
        //  异步请求默认不携带cookie 数据. request.getCookies();所以它是空. 但是它在请求头中. 从请求头中获取！
        //        String token = "";
        //        Cookie[] cookies = request.getCookies();
        //        for (Cookie cookie : cookies) {
        //            if ("token".equals(cookie.getName())){
        //                token = cookie.getValue();
        //            }
        //        }
        //        String token1 = request.getHeader("token");
        //        System.out.println(token1+"....header");
        //  登录key
        String userLoginKey = RedisConst.USER_LOGIN_KEY_PREFIX+token;
        //  del key
        this.redisTemplate.delete(userLoginKey);
        return Result.ok();
    }
}
